/**
 * 全局配置
 */
// 确保在其他代码执行前加载环境变量
require('dotenv').config();
const { ServerApiVersion } = require('mongodb');

// 获取程序运行环境
const environment = process.env.NODE_ENV || 'development';

// 构建MongoDB连接URI
const buildMongoURI = () => {
  // 直接从环境变量获取完整URI，这是推荐的安全做法
  if (process.env.MONGO_URI) {
    return process.env.MONGO_URI;
  }
  
  // 如果没有提供完整URI，则从各个组件构建
  const username = encodeURIComponent(process.env.MONGO_USER || '');
  const password = encodeURIComponent(process.env.MONGO_PASSWORD || '');
  const host = process.env.MONGO_HOST || '';
  const dbName = process.env.MONGO_DB_NAME || 'whatsapp_platform';
  
  // 验证必要的凭据是否存在
  if (!username || !password || !host) {
    console.error('错误: 缺少MongoDB连接信息。请在环境变量中提供MONGO_URI或MONGO_USER, MONGO_PASSWORD和MONGO_HOST');
    return '';
  }
  
  // 构建完整URI
  return `mongodb+srv://${username}:${password}@${host}/${dbName}?retryWrites=true&w=majority`;
};

// 生成随机密钥（仅在密钥未设置时使用，不要在生产环境依赖此功能）
const generateRandomSecret = () => {
  if (environment === 'production') {
    console.error('❌ 严重错误: 在生产环境中未设置JWT_SECRET，这是一个安全风险!');
    console.error('请立即在环境变量中设置强随机JWT_SECRET');
    process.exit(1); // 在生产环境中直接退出
  }
  
  console.warn('⚠️  警告: 使用随机生成的JWT密钥，仅适用于开发环境');
  // 生成随机字符串作为密钥
  return require('crypto').randomBytes(64).toString('hex');
};

module.exports = {
  // 服务器
  port: process.env.PORT || 3001,
  nodeEnv: environment,
  
  // 前端地址（用于CORS和WebSocket）
  frontendURLs: [
    'http://localhost:3000', 
    'https://whatsapp-platform.example.com',  // 替换为实际生产环境地址
    ...(process.env.ALLOWED_ORIGINS ? process.env.ALLOWED_ORIGINS.split(',') : [])
  ].filter(Boolean),
  
  // MongoDB
  mongodb: {
    uri: buildMongoURI(),
    options: {
      serverApi: {
        version: ServerApiVersion.v1,
        strict: true,
        deprecationErrors: true,
      },
      // 保留以下选项以向后兼容
      useNewUrlParser: true,
      useUnifiedTopology: true,
      serverSelectionTimeoutMS: 5000,
      socketTimeoutMS: 45000,
    }
  },
  
  // WebSocket配置
  socket: {
    path: '/socket.io',  // 明确的路径
    pingTimeout: 30000,  // 30秒超时
    pingInterval: 10000, // 10秒ping一次
    cookie: environment === 'production', // 生产环境使用cookie
    serveClient: false,  // 不提供客户端文件
  },
  
  // JWT
  jwt: {
    secret: process.env.JWT_SECRET || generateRandomSecret(),
    expiresIn: process.env.JWT_EXPIRES_IN || '8h', // 降低默认过期时间为8小时
    algorithm: 'HS256',
    issuer: 'whatsapp-platform',
    audience: 'whatsapp-users',
    notBefore: 0,  // 立即生效
    jwtid: undefined, // 可选的JWT ID
    subject: undefined, // 可选的subject
    clockTolerance: 30, // 允许30秒的时钟偏移
    maxAge: '8h', // 令牌最大有效期
    refreshExpiresIn: '14d' // 刷新令牌有效期
  },
  
  // 安全配置
  security: {
    passwordMinLength: 10, // 增加密码最小长度
    passwordHashRounds: 12, // 增加bcrypt加密轮数
    rateLimitWindow: 15 * 60 * 1000, // 15分钟
    rateLimitMax: 100, // 每个IP最多100个请求
    encryptionKey: process.env.ENCRYPTION_KEY || process.env.JWT_SECRET || generateRandomSecret(), // 用于敏感数据加密
    sessionTimeout: 30 * 60 * 1000, // 30分钟session超时
    csrfProtection: true, // 启用CSRF保护
    contentSecurityPolicy: true, // 启用CSP
    xssProtection: true, // 启用XSS保护
    passwordPolicies: {
      requireUppercase: true,
      requireLowercase: true,
      requireNumbers: true,
      requireSpecialChars: true
    }
  },
  
  // WhatsApp
  whatsapp: {
    dataPath: process.env.WHATSAPP_DATA_PATH || './whatsapp-session',
    maxInstances: 5, // 最大WhatsApp实例数量
    reconnectInterval: 10000, // 10秒重连间隔
    sessionTimeout: 12 * 60 * 60 * 1000, // 12小时会话超时
    sessionCleanupInterval: 24 * 60 * 60 * 1000, // 24小时清理一次过期会话
    mediaStoragePath: process.env.WHATSAPP_MEDIA_PATH || './uploads/media',
    mediaExpireDays: 30, // 媒体文件保存30天后自动删除
    // 代理配置
    proxy: {
      enabled: process.env.PROXY_ENABLED === 'true', // 只有明确设置为true时才启用代理
      host: process.env.PROXY_HOST || '127.0.0.1',
      port: process.env.PROXY_PORT || '10808', // 默认使用Socks5端口
      type: process.env.PROXY_TYPE || 'socks5', // socks5 或 http
      username: process.env.PROXY_USERNAME || '',
      password: process.env.PROXY_PASSWORD || ''
    }
  },
  
  // 用户角色
  roles: {
    ADMIN: 'admin',
    SALES: 'sales'
  },
  
  // 敏感内容检测
  sensitiveMatcher: {
    numberPattern: /\d{7,}/,
    storageExpireDays: 30, // 敏感内容存储时间，30天
  },
  
  // 活动跟踪
  activityTracking: {
    inactiveTimeout: 60000, // 1分钟不活跃视为离线
    trackingInterval: 60000 * 5, // 5分钟记录一次活动报告
    retentionDays: 90 // 活动数据保留90天
  },
  
  // 日志配置
  logging: {
    level: environment === 'production' ? 'info' : 'debug',
    maxFiles: 30, // 增加日志文件数量
    maxSize: '10m', // 增加日志文件大小
    directory: process.env.LOG_DIR || './logs',
    consoleOutput: environment !== 'production', // 非生产环境输出到控制台
    format: 'json', // 使用JSON格式更容易解析
    errorLogFile: 'error.log',
    accessLogFile: 'access.log',
    securityLogFile: 'security.log',
    auditLogFile: 'audit.log'
  },
  
  // 文件上传配置
  uploads: {
    maxFileSize: 10 * 1024 * 1024, // 10MB最大文件大小
    allowedMimeTypes: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
    uploadDir: process.env.UPLOAD_DIR || './uploads',
    tempDir: './uploads/temp',
    cleanupInterval: 60 * 60 * 1000 // 1小时清理一次临时文件
  }
}; 